Reading the data


Lately, the .fits data was transformed into .csv and saved in database/csv_files. We are going to import a light curve sample and work with it.

[ ]:
FILE_PATH = r'C:\Users\guisa\Google Drive\01 - Iniciação Científica\02 - Datasets\csv_files\EN2_STAR_CHR_0101086161_20070516T060226_20071005T074409.csv'
[ ]:
import pandas as pd

data_sample = pd.read_csv(FILE_PATH)
display(data_sample)
DATE WHITEFLUX
0 2007-05-16 18:10:55.071642 112626.77
1 2007-05-16 18:19:27.113766 112605.61
2 2007-05-16 18:27:59.155929 112771.50
3 2007-05-16 18:36:31.198092 113113.60
4 2007-05-16 18:45:03.240256 112621.79
... ... ...
23946 2007-10-05 19:08:02.358665 112438.61
23947 2007-10-05 19:16:34.313684 112406.01
23948 2007-10-05 19:25:06.268742 112496.13
23949 2007-10-05 19:33:38.223801 112344.83
23950 2007-10-05 19:42:10.178859 112318.50

23951 rows × 2 columns

[ ]:
import numpy as np

x = data_sample.DATE.to_numpy()
y = data_sample.WHITEFLUX.to_numpy()

Ideal Lowpass Filters


Um filtro bi-dimensional passa-baixa que deixa passar todas as frequências em um círculo de raio \(D_0\) a partir da origem e remove todas as frequências fora desse círculo é chamado de filtro passa-baixa ideal (ILPF) e é descrito como

\[\begin{split} H(u) = \begin{cases} 1, &\text{if } D(u) \le D_0 \\ 0, &\text{if } D(u) \ge D_0 \end{cases}\end{split}\]

onde \(D_0\) é uma constante positiva, e \(D(u)\) é a distância entre um ponto \(u\) até o centro do retângulo de frequência, ou seja, é definido por

\[D(u) = (u-P/2)\]

sendo \(P\) o tamanho do vetor original preenchido (padded).

O ponto de transição entre \(H(u) = 1\) e \(H(u) = 0\) é chamado de frequência de corte

[ ]:
!pip install control
from tools import *
WARNING: You are using pip version 21.1.1; however, version 21.1.3 is available.
You should consider upgrading via the 'c:\users\guisa\appdata\local\programs\python\python38\python.exe -m pip install --upgrade pip' command.
Requirement already satisfied: control in c:\users\guisa\appdata\local\programs\python\python38\lib\site-packages (0.9.0)
Requirement already satisfied: scipy in c:\users\guisa\appdata\local\programs\python\python38\lib\site-packages (from control) (1.6.1)
Requirement already satisfied: matplotlib in c:\users\guisa\appdata\local\programs\python\python38\lib\site-packages (from control) (3.3.4)
Requirement already satisfied: numpy in c:\users\guisa\appdata\local\programs\python\python38\lib\site-packages (from control) (1.19.5)
Requirement already satisfied: pillow>=6.2.0 in c:\users\guisa\appdata\local\programs\python\python38\lib\site-packages (from matplotlib->control) (8.1.0)
Requirement already satisfied: cycler>=0.10 in c:\users\guisa\appdata\local\programs\python\python38\lib\site-packages (from matplotlib->control) (0.10.0)
Requirement already satisfied: kiwisolver>=1.0.1 in c:\users\guisa\appdata\local\programs\python\python38\lib\site-packages (from matplotlib->control) (1.3.1)
Requirement already satisfied: pyparsing!=2.0.4,!=2.1.2,!=2.1.6,>=2.0.3 in c:\users\guisa\appdata\local\programs\python\python38\lib\site-packages (from matplotlib->control) (2.4.7)
Requirement already satisfied: python-dateutil>=2.1 in c:\users\guisa\appdata\local\programs\python\python38\lib\site-packages (from matplotlib->control) (2.8.1)
Requirement already satisfied: six in c:\users\guisa\appdata\roaming\python\python38\site-packages (from cycler>=0.10->matplotlib->control) (1.15.0)
Loading BokehJS ...
[ ]:
def ideal_filter(array, fourier_transform, cutoff_freq):
  n_time = len(array)
  D0 = cutoff_freq * n_time
  xc = n_time

  for i in range(len(fourier_transform)):
    if fourier_transform[i] > D0:
      fourier_transform[i] = 0

  y_filtered = np.real(np.fft.ifft(fourier_transform))
  y_filtered += (array.mean() - y_filtered.mean())

  return y_filtered
[ ]:
def ideal_filter_result(array, cutoff_freq, numExpansion):
  Filter = filters.FrequencyDomainFiltering()

  Filter.expand_borders(y, numExpansion)
  y_expanded = Filter.getExpandedBorders

  y_filtered = ideal_filter(y_expanded, np.fft.fft(y_expanded), cutoff_freq)

  Filter.remove_expanded_borders(y_filtered, numExpansion)
  y_filtered = Filter.getNoExpanded

  return y_filtered

Choosing the best Ideal Filter parameters


[ ]:
cutoff_freqs = [0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9]
[ ]:
i = 0
cutoff_freq = cutoff_freqs[i]

y_filtered = ideal_filter_result(y, cutoff_freq, 70)
title = f"Ideal filter with Cutoff frequency = {cutoff_freq}"
viz.view_filter_results(x, y, x, y_filtered, title=title)
print()
i += 1

[ ]:
cutoff_freq = cutoff_freqs[i]

y_filtered = ideal_filter_result(y, cutoff_freq, 70)
title = f"Ideal filter with Cutoff frequency = {cutoff_freq}"
viz.view_filter_results(x, y, x, y_filtered, title=title)
print()
i += 1

[ ]:
cutoff_freq = cutoff_freqs[i]

y_filtered = ideal_filter_result(y, cutoff_freq, 70)
title = f"Ideal filter with Cutoff frequency = {cutoff_freq}"
viz.view_filter_results(x, y, x, y_filtered, title=title)
print()
i += 1

[ ]:
cutoff_freq = cutoff_freqs[i]

y_filtered = ideal_filter_result(y, cutoff_freq, 70)
title = f"Ideal filter with Cutoff frequency = {cutoff_freq}"
viz.view_filter_results(x, y, x, y_filtered, title=title)
print()
i += 1

[ ]:
cutoff_freq = cutoff_freqs[i]

y_filtered = ideal_filter_result(y, cutoff_freq, 70)
title = f"Ideal filter with Cutoff frequency = {cutoff_freq}"
viz.view_filter_results(x, y, x, y_filtered, title=title)
print()
i += 1

[ ]:
cutoff_freq = cutoff_freqs[i]

y_filtered = ideal_filter_result(y, cutoff_freq, 70)
title = f"Ideal filter with Cutoff frequency = {cutoff_freq}"
viz.view_filter_results(x, y, x, y_filtered, title=title)
print()
i += 1

[ ]:
cutoff_freq = cutoff_freqs[i]

y_filtered = ideal_filter_result(y, cutoff_freq, 70)
title = f"Ideal filter with Cutoff frequency = {cutoff_freq}"
viz.view_filter_results(x, y, x, y_filtered, title=title)
print()
i += 1

[ ]:
cutoff_freq = cutoff_freqs[i]

y_filtered = ideal_filter_result(y, cutoff_freq, 70)
title = f"Ideal filter with and Cutoff frequency = {cutoff_freq}"
viz.view_filter_results(x, y, x, y_filtered, title=title)
print()
i += 1

[ ]:
cutoff_freq = cutoff_freqs[i]

y_filtered = ideal_filter_result(y, cutoff_freq, 70)
title = f"Ideal filter with Cutoff frequency = {cutoff_freq}"
viz.view_filter_results(x, y, x, y_filtered, title=title)
[ ]: